import axios, { type Method } from 'axios'
import { getToken } from './token-utils'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
import { ElMessage } from 'element-plus'
import {getUserTempId} from '@/utils/auth' 


//创建axios实例
const instance = axios.create({
  baseURL: '/app-dev',
  timeout: 5000
})

// 添加请求拦截器
instance.interceptors.request.use(function (config) {
  //请求前，展示进度条
  NProgress.start()

  //获取token
  const token = getToken()
  //判断token是否存在
  if (token) {
    //向请求头添加token
    config.headers.token = token
  }

  // 向请求头添加 userTempId
  config.headers.userTempId = getUserTempId()

  // 在发送请求之前做些什么
  return config;
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error);
});

// 添加响应拦截器
instance.interceptors.response.use(function (response) {
  //关闭进度条
  NProgress.done()

  // 2xx 范围内的状态码都会触发该函数。
  // 对响应数据做点什么
  const res = response.data
  //判断状态码
  switch (res.code) {
    //响应成功
    case 200:
      return res
    case 208:
      //token过期，提示用户登录身份过期’
      ElMessage.error('登录身份已过期,请重新登录')
      break
    case 201:
      ElMessage.error('请求参数错误')
      return Promise.reject(res)
      case 202:
      ElMessage.error('请输入正确的手机号或密码！')
      return Promise.reject(res)

      case 206:
      ElMessage.error('网络异常')
      return Promise.reject(res)

      case 223:
      ElMessage.error('手机号已被注册')
      return Promise.reject(res)
    default:
      ElMessage.error('接口异常，请检查接口地址')
      return Promise.reject(res)
  }
}, function (error) {
  //关闭进度条
  NProgress.done()
  // 超出 2xx 范围的状态码都会触发该函数。
  // 对响应错误做点什么
  return Promise.reject(error);
});

export interface IResponseData<T> {
  code: number
  message: string
  success?: boolean
  data: T
  ok?:boolean
}

//封装请求方法request
function http<T>(url: string, method: Method, submitData?: any): Promise<IResponseData<T>> {
  //将传递的请求方式进行大写转换
  const newMethod = method.toUpperCase()
  //判断请求的方式：如果请求方式为post、delete、put，请求数据为data；如果请求方式为get，请求数据为params
  const data =
    newMethod === 'POST' || newMethod === 'PUT' || newMethod === 'DELETE' ? submitData : {}
  const params = newMethod === 'GET' ? submitData : {}

  return instance.request({
    url,
    method,
    data,
    params
  })
}

//暴露
export { instance,http }